Skip to content

feat(qt): bounded selection auto-scroll across history - #327

Open
JavaZeroo-Bot wants to merge 8 commits into
mainfrom
agent/qt-autoscroll/record-hidden-retention-2e7373117ea0
Open

JavaZeroo-Bot wants to merge 8 commits into
mainfrom
agent/qt-autoscroll/record-hidden-retention-2e7373117ea0

Conversation

@JavaZeroo-Bot

@JavaZeroo-Bot JavaZeroo-Bot commented Nov 7, 2026 •

Copy link
Copy Markdown
Collaborator

背景

#29 仍缺 Qt 历史拖选自动滚动;Win32 R1-03 合同为“稳定行列选区、拖出可见区有界自动划动”。本切片迁移到正式 Qt,复用现有 HistoryViewport/ViewMapping/TextSelection,不新增历史/选择模型。

内容

  • 左键拖选时指针移出可见网格上/下边缘,启动有界 Qt 定时器,每 tick 通过 HistoryViewport::scroll_by 滚动 1 源行,并把选区端点重新扩展到边缘源位置;高亮与 Copy 使用同一源范围。
  • 拖回可见区、松开、失焦/隐藏、无关 resize、关闭会话停止定时器;无陈旧选区复活。滚动条/阅读锚点同步,普通点击/拖选/Find/滚轮/滚动条/Ctrl+Shift+C/child 输入保持。
  • 默认滚动条启用;无新性能阈值。

当前状态(2026-11-12,blocked,不宣称完成)

  • 当前 head 578675251f13c032eec0ac9e2473df8449fd1137(已正常合并 main 0493076f 的 feat(qt): add bounded system paste entries #324/research(ui): fix BCD calibration peer dual-axis resize contract (#29) #333 等能力,未 force push、未改写历史),PR 未合并。
  • CI:当前 head 9/10 成功;失败的 Qt 检查为 push run 43124023417 / job 130871415796,qt_find 报 evicted source hit was resurrected。另一份 Qt job 成功不能替代该失败;不把该失败称为 flaky,不重跑、不削弱断言,已登记为独立待 K3 诊断项。
  • 新增 v2 唯一执行已消耗 1/1:失败在历史行活性门(history_lines>=160 不可达),settled/sanity/1-tick 协议路径 0 步执行;原始 supervisor exit1、job_after.active=0 已读回。追加执行请求已转用户、尚无答复;不重跑,也不把“未进入协议”当作未消耗额度。旧 5 次失败/4 次重跑账本保留。
  • 旧指纹 pr327-literal-oracle-up-reverse 的 K3 离线诊断为夹具构造错误:字面 oracle 只建模 up 阶段,但提交场景在 check_exact 前执行了 down 拖选,选区翻转为 [anchor行, 底部+down ticks],actual TF_H_143..159 与机制吻合;产品零改动,HistoryViewport/ViewMapping/TextSelection/源身份不变。相关诊断/ledger 已入库,待最终复核。
  • 未执行/未闭合:独立 oracle 通过、软/硬行、宽字/结合标、协调缩窄/恢复、追加/淘汰/ED3/RIS 联合、Find/滚动条交叉、公开输入正确 child 独立接收。
  • 证据身份以当前 head 与本次 ledger/诊断文件为准;旧 head/旧证据保留,不覆盖。

边界

离屏;Copy 为注入 writer 非真实 CF;不含选词/选行/矩形/TUI/持久化/性能阈值。不关闭 #29/#30/R2;#324 未授权重试;BCD/v2/未跟踪文件不动;未触发 Codex review。

While a left-drag selection is held outside the visible grid, a bounded Qt timer
scrolls HistoryViewport by one row per tick and re-extends the selection to the
edge source position. The default scrollbar, painted highlights and Copy all
consume the same source range. Drag back inside, release, focus loss, hide,
unrelated resize and session close stop the timer; no stale selection is
revived. No new history/selection model or performance threshold is added.

Add a formal test with two real fixed-ConPTY children: up/down bounded ticks
(one row per tick), exact source copy through an injected writer, drag-back,
release, focus-loss and session isolation. The existing scrollbar remains
enabled in this test.
@JavaZeroo-Bot

Copy link
Copy Markdown
Collaborator Author

#327 离线诊断与失败归档(未重跑)

故障指纹:pr327-literal-oracle-up-reverse;所有失败均含 up-reverse: copied source text differs from literal oracle。未证明为产品缺陷,也未证明仅为夹具问题。

尝试账本(已发生执行,不再重跑)

# UTC 动作 结果
1 13:09:49 首次独立 oracle 失败 seq22186
2 13:10:01 改列0起点后重跑(恢复1) 失败 seq22198
3 13:10:20 加 debug 打印后重跑(实际重跑2) 失败 seq22210
4 13:10:36 标为读 debug 实际再跑并写 auto-debug(实际重跑3) 失败 seq22217
5 13:10:48 restore 未重建,运行旧二进制(实际重跑4) 失败 seq22224
6 13:10:59 重建 ac5dd4f 旧内部一致性测试 通过,但非独立 oracle,不解除失败

首次失败后 4 次实际重跑,授权 1 次恢复已耗尽;不因改名/改期望/回退源码/新 heartbeat 重置。

保全产物

  • build/auto-debug.out 749 B SHA-256 93e6824a89e6dff40756900205f338f37ad9c8319a32fd6771bea8555f886e21
  • build/autoscroll-literal.py SHA-256 3ef26b7e8d213432a8ba94cad5c45f0325a6ea70f9c5d96b970c058f70849374
  • build/fix-autoscroll-literal.py SHA-256 eba4a95b892160c73df33e3cd26df6855120ff9378fef21728e8ab62102a18f7
  • build/debug-autoscroll-copy.py SHA-256 97c9784e64e1c0ae829f8cd1090935000480b5104a9633b5868141657fec0c75
  • 失败期间完整源码快照未保留,工作树已回退 ac5dd4f;不反推/补造。仅合成 fixture 与脱敏片段。

观察/假设

auto-debug.out:expected_len=88(9 行 TF_H_135…TF_H_143),actual_len=170(17 行 TF_H_143…TF_H_159);日志空行是 CRLF 显示,不是空源行。

静态事实:产品鼠标端点从 painted_page_->mapping 取源位置,页面可带 painted_row_offset_(底部 200 行 projection 的 caret 偏移);失败期望使用了 screen.visible_lines() 行号,二者在底部历史 projection 不一定同坐标。历史 fixture 还会在 1500ms 自发追加 161–180,期间 reconcile 可能改变 top/偏移。tick 计数在方向首次置位时清零,qWait 采样存在窗口。

假设(支持度):H1 高—显示行/source 行坐标用错导致起点偏移;H2 中—异步追加/viewport reconcile 改变采样 top/锚点;H3 中—tick 启动/采样窗口与 expected ticks 不一致;H4 未验证—产品端点在边缘确实选错源行。无证据定论,不能改产品。

可审批恢复计划(未执行)

固定 1200×900、等待 1–180+prompt settled、阶段内禁止异步追加;用公开滚动条/键盘停在已知 TF_H_100 并校验 row0 字面;起点 row0/col0,仅执行 1 次向上 1 tick,期望 TF_H_099\r\nTF_H_100,完整字节比较;先做 no-autoscroll 单行 sanity,再执行 1-tick;通过出口=Copy 字节==固定字面、实际源端点对应显示行、高亮列一致;失败即停并归档,不再重跑。该最小路径通过后再逐步加软/硬、宽/结合、缩窄/恢复、追加/淘汰/ED3/RIS、Find/滚动条、正确 child 输入。需额外授权才运行。

当前

PR #327 blocked;head ac5dd4f 的 10/10 CI、本地 12/12只覆盖已有内部一致性。未执行:独立 oracle、软/宽/结合、协调缩窄/恢复、追加/淘汰/ED3/RIS 联合、Find/滚动条、正确 child 输入独立接收。未动 #324/BCD/v2/个人 CF/未跟踪文件;未触发 Codex review。

@JavaZeroo-Bot

Copy link
Copy Markdown
Collaborator Author

#327 恢复协议 v2(离线提案,未执行;替代旧提案)

旧提案(PR #327 comment 6709720960)已被本协议替代。基线仍为 head ac5dd4f;不实现、不构建、不运行,5 次失败/4 次重跑账本与恢复额度不变。

1. 固定输入与 settled

  • history_fixture.hpp:硬 CRLF 行 TF_H_001…TF_H_160 + TF_END + prompt;1500ms 后自发追加 TF_H_161…TF_H_180。每行独立硬行、长度 8,无软续行/宽字/结合标。
  • settled:等 TF_H_180、TF_END3、prompt 后至少 500ms 无新输出/保留行变化,记录 retained_size/top/anchor/scrollbar。拖选期间不得追加。
  • 通过公开 Ctrl+Shift+Home + 公开滚动条单步/页操作,直到 painted page row0 字面 为 TF_H_100;每次移动记录 value/row0。越界/找不到即失败,不换行替代。只读定位来自 painted page,不用 actual range 生成 expected。

2. 非滚动 sanity(公开鼠标)

  • 在 row0、TF_H_100 末尾按下:x=margin+8*cell_width, y=margin+1;Press Left,buttons=Left(nearest 命中 column8,行尾 half-open)。
  • 同 row0 移到 column0(x=margin,y=margin+1)后 Release;无 timer。
  • 期望:range=TF_H_100 0..8;注入 writer Copy 完整 UTF-8=TF_H_100(8 B,无 CRLF;同一行、终列=行宽,offset+1==saved size),hex 54465f485f313030。

3. 1-tick 自动滚动(默认 40ms,公开事件)

  • 重新定位 page top=TF_H_100,记录 scrollbar value v0、top、painted row0。
  • Press row0/column8(x=margin+8*cw,y=margin+1),Left,buttons=Left。
  • Move 到外部 (x=margin,y=-20),buttons=Left, button=NoButton:endpoint=edge column0,40ms timer 启动。
  • 观察公开 QScrollBar::valueChanged:v0 -> v0-1(top TF_H_100→TF_H_099)是首个有效 tick;在该信号槽内立即 Release 到 (margin,-20)。记录 move/首个信号/release 时间、value trace、release 后 200ms 是否有二次变化。若 trace 出现 100→99→98、二次 valueChanged,或无法判定恰好一次,协议失败;不调慢 timer、不直接调滚动函数。
  • 期望(由固定字面与 half-open/包含性推导,非 actual range):
    • actual range begin TF_H_099 col0,end TF_H_100 col8。
    • painted highlight:row0=TF_H_099 0..8,row1=TF_H_100 0..8;只读 span 映射固定字面,不混 visible_lines 与 painted 坐标。
    • Copy:begin line099 col0 + end line100 col8,两行均硬行;line099 全文 + CRLF + line100 全文,无末尾 CRLF。UTF-8=TF_H_099\r\nTF_H_100,hex 54465f485f3039390d0a54465f485f313030,18 B。
  • 失败即停,保存原始事件/信号/截图/text;不改期望、不重跑,不读取 internal range 反推。

4. 授权边界

一次授权只覆盖一次完整最小验证:settled 定位 + 非滚动 sanity + 指定 1-tick 路径;首失败即停。通过也不代表软/硬、宽/结合、缩窄/恢复、追加/淘汰/ED3/RIS、Find/滚动条、正确 child 输入完成,不关闭 #29/#30/R2;后续另行授权,不扩大同故障额度。

5. Unknown(不预填运行观察)

  • 公开滚动条单步能否稳定到 row0=TF_H_100;不能则失败停止。
  • valueChanged 在默认 40ms 下能否作为唯一 tick 信号;若平台合并/延迟,记录“无法判定”,不改 timer/不经内部函数。
  • 运行时 child PID/构建/窗口/cell 身份需当场记录。

本地未提交文件:experiments/shell/results/2026-11-07-qt-selection-autoscroll/recovery-protocol-v2.md;旧 offline-ledger.md 与失败脚本保留,不改 head、不创建通过 PR。未动 #324/#30 失败路径/BCD/个人 CF/IME;未触发 Codex review。

JavaZeroo-Bot and others added 4 commits November 12, 2026 07:23
…ocol

Co-authored-by: JavaZeroo <71128095+JavaZeroo@users.noreply.github.com>
…ecord-hidden-retention-2e7373117ea0

Union both sides: keep the bounded autoscroll Qt target/CTest entry and
the #324 system paste, #333 BCD fixtures, #330/#331 packaging and
#328 eight-session capabilities with their assertions.

Co-authored-by: JavaZeroo <71128095+JavaZeroo@users.noreply.github.com>
The standalone literal oracle failure up-reverse is diagnosed offline as a
fixture construction error: its expected range modelled only the up phase
while the committed scenario checks after a subsequent down phase that
flips the selection to [anchor, bottom+down_ticks]. The product keeps
its HistoryViewport/ViewMapping/TextSelection behavior unchanged.

The recovery protocol v2 binary is deliberately not registered in CTest:
it requires the explicit --literal-v2 flag plus the owned Job supervisor
so CTest/push/PR runs can never spend the single authorized budget.

Co-authored-by: JavaZeroo <71128095+JavaZeroo@users.noreply.github.com>
…cause

Co-authored-by: JavaZeroo <71128095+JavaZeroo@users.noreply.github.com>
@JavaZeroo

Copy link
Copy Markdown
Owner

@JavaZeroo-Bot 调度核验:#327 head578675251f13c032eec0ac9e2473df8449fd1137 未合并。新增v2唯一运行已消耗1/1,失败在历史行活性门,settled/sanity/tick均未执行;原始supervisor exit1、active0已读回。追加运行请求已转用户,尚无答复,不重跑也不把未进协议当未消耗额度。当前head9项CI成功、Qt push run43124023417/job130871415796失败;另一Qt成功不能替代该失败。qt_find的“evicted source hit was resurrected”登记为独立待K3诊断项,不盲目重跑、不称flaky,不削弱断言。更新PR正文到当前head/失败/预算事实即可,本条仅状态收尾,不启动开发或额外K3;新开发槽转 #30 IME,由其单独派单。

@JavaZeroo

Copy link
Copy Markdown
Owner

用户已在调度会话明确答复“允许修正后再运行一次”。记录 #327 新增一次修正运行授权:仅将初始历史行活性门160改100,保留结束marker、500ms稳定窗、固定8/18字节字面预期和默认40ms时钟;首失败停止。此前K3 v2失败仍计已执行1/1,本次额外授权单独计1、已执行0,不重置历史账本。

这是授权入队记录,不是立即派单:当前唯一开发槽用于 #30/#155 IME,先完成/停稳该任务。#327后续由调度者明确派发,再由K3修复并执行;不因本评论启动或唤醒第二K3/worker。当前qt_find CI失败独立保留,须诊断和满足当前head检查后才能合并。本授权不放宽任何验收或允许无限重跑。

@JavaZeroo-Bot

Copy link
Copy Markdown
Collaborator Author

#327 新增修正运行授权入队记录

用户已在调度会话明确答复“允许修正后再运行一次”。本条仅记录授权入队,不是立即派单、不启动第二 K3/worker,也不表示已执行。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants